package com.cet.designpatterns.template.hook;

/**
 * @program: algorithm
 * @description: 抽象豆浆类
 * @author: 陈恩涛
 * @create: 2021-09-16 21:46
 **/
public abstract class SoyaMilk {

    /**
     * 模版方法，make，模版方法可以写成final，不让子类进行重写
     */
    final void make() {
        select();
        if (customerNeedIngredients()) {
            addIngredients();
        }
        soak();
        grind();
    }

    private void select() {
        System.out.println("第一步：选择新鲜的黄豆");
    }

    /**
     * 由子类具体实现
     */
    public abstract void addIngredients();

    private void soak() {
        System.out.println("第三步：黄豆和配料一起浸泡，需要三小时");
    }

    private void grind() {
        System.out.println("第四步：黄豆和配料放到豆浆机进行打磨");
    }

    /**
     * 钩子方法，决定是否需要添加配料
     * @return
     */
    protected boolean customerNeedIngredients() {
        return true;
    }

}
